/*
 * @Author: MrDotYan 2564217790@qq.com
 * @Date: 2024-09-26 17:28:59
 * @LastEditors: MrDotYan 2564217790@qq.com
 * @LastEditTime: 2024-09-26 17:39:39
 * @FilePath: /midway-admin/webServerAdmin/src/utils/funcHelper.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

/***
 * 防抖函数
 * @param func - 需要防抖的函数
 * @param delay - 延迟时间，默认为200毫秒
 * @returns 返回一个新的函数，只有在延迟时间内没有再次调用时，才会执行原函数
 */
export function debounce<T extends (...args: any[]) => any>(func: T, delay = 200, immediate = false) {
  let timer: NodeJS.Timeout | undefined; // 定义 timer 的类型
  return function (this: any, ...args: Parameters<T>) {
    // 添加 this 的类型注解
    const callNow = immediate && !timer;
    clearTimeout(timer);
    timer = setTimeout(() => {
      timer = undefined; // Clear the timer
      if (!immediate) func.apply(this, args); // 使用 this
    }, delay);
    if (callNow) func.apply(this, args); // Call immediately
  };
}

/***
 * 节流函数
 * @param func - 需要节流的函数
 * @param delay - 延迟时间，默认为200毫秒
 * @param trailing - 是否在最后一次调用后执行函数
 * @returns 返回一个新的函数，只有在延迟时间内才会执行原函数
 */
export function throttle<T extends (...args: any[]) => any>(func: T, delay = 200, trailing = true) {
  let lastCall = 0; // 上一次调用的时间
  let timer: NodeJS.Timeout | undefined; // 定义 timer 的类型
  return function (this: any, ...args: Parameters<T>) {
    const now = Date.now();
    const remaining = delay - (now - lastCall);

    if (remaining <= 0) {
      lastCall = now; // 更新上一次调用时间
      func.apply(this, args); // 使用 this
    } else if (trailing && !timer) {
      timer = setTimeout(() => {
        lastCall = Date.now(); // 更新上一次调用时间
        timer = undefined; // 清除定时器
        func.apply(this, args); // 使用 this
      }, remaining);
    }
  };
}
